分享好友 技术首页 技术分类 切换频道

CAN总线控制器的初始化程序

2020-07-18 07:06100

摘  要:介绍了can总线控制器sja1000芯片,并给出用c51语言编写sja1000总线控制器的初始化程序,方便使用者学习和掌握。

关键词:sja1000;can总线;c51;寄存器

 

0  引  言

随着自动化底层设备通信的需要,使现场总线技术得到了迅速的发展,各厂家都纷纷推出自己的总线控制器。sja1000 就是philips公司推出的一种高性能的can总线控制器,它得到了广泛的应用,但是有关sja1000初始化的文章比较少见,介绍的程序也不完全,这给使用者增加了难度。为了方便使用者掌握和使用can总线,本文作者成功地运用c51语言初始化sja1000为核心的can总线控制器,缩短了程序开发周期,提高了工作效率。

 

1  sja1000的新功能与内部结构

1.1  sja1000的主要新功能

sja1000是philips公司早期can总线控制器pca82c200的替代品,功能更强大,与pca82c200相比,具有许多优点,详见文献[4].

1.2  sja1000的内部寄存器

sja1000的寄存器和管脚配置允许它使用于各种各样的集成的或分立的can 收发器,这使不同微控制器之间的接口能够被灵活运用。若要正确、灵活的运用sja1000,就必须了解内部寄存器的地址、功能和作用。sja1000内部寄存器的结构如表1所示(具体每一位的作用,请参阅文献[2]).

1.3  sja1000与89c52的连线原理

为了连接到主控制器,sja1000提供一个复用的地址/数据总线和附加的读/写控制信号,见图1.sja1000能被看作外围存储器并为主控制器映射i/o设备。为了保证系统的同步,本电路使用了一个24 mhz的晶振作为sja1000的振荡器,用它的7号引脚(clkout)作为89c52的时钟脉冲。本文中sja1000的片选由微控制器的p2.7口控制,其内部寄存器的地址由p0口和p2口共同来决定,p0口为低8位,p2口为高8位。

图1  原理接线图

 

 

 

2  程  序

c语言是一种常用的计算机程序设计语言,它既有语言的各种特征,又能直接操作系统硬件,而且可以进行结构化程序设计,用c语言编写的程序很容易移植。近年来出现的各种专为微型计算机设计的c语言编译器,如美国franklin软件公司推出的franklin c51,德国keil公司推出keil c软件,都是高性能的c编译器,它编译的目标代码简洁且运行速度高。后者是现在比较流行的软件,它深受单片机开发人员的喜爱。下面就以keil c51为平台,系统的介绍如何用c51语言对sja1000 can总线控制器进行初始化。

从图1可以看到,主控制器89c52的p0.0-p0.7直接与sja1000的ad0-ad7相连,主控制器既要传送地址,又要传送数据,就必须对p0口进行分时控制,而sja1000的ad0-ad7正好提供一个复用的地址/数据总线和附加的读/写控制信号。

sja1000由主控制器的程序进行功能配置和激活,因此sja1000能满足不同属性的can总线系统的要求。主控制器89c52和sja1000之间的数据交换经过一系列的寄存器控制段和一个ram 信息缓冲器完成,对于主控制器来说,构成发送和接收

  sja1000初始化流程图

缓冲器的寄存器和一部份ram的地址窗口,就象是外围的寄存器。

sja1000初始化的流程图如图2所示。

为了让工程技术人员更加深入的学习和使用can总线,这里完整的给出了sja1000的初始化程序。

程序如下:

#define crxbyte[0x8000]                 // 控制寄存器地址

#define cmrxbyte[0x8001]                // 命令寄存器地址

#define srxbyte[0x8002]                 // 状态寄存器地址

#define irxbyte[0x8003]                 // 中断寄存器地址

#define acrxbyte[0x8004]                // 验收码寄存器地址

#define amrxbyte[0x8005]                // 验收屏蔽寄存器地址

#define btr0xbyte[0x8006]               // 总线定时寄存器0地址

#define btr1xbyte[0x8007]               // 总线定时寄存器1地址

#define ocrxbyte[0x8008]                // 输出控制寄存器地址

#define trxbyte[0x8009]                 // 测试寄存器地址

#define transbuffer1xbyte[0x800a]       // 发送缓冲器

#define transbuffer2xbyte[0x800b]

#define transbuffer3xbyte[0x800c]

#define transbuffer4xbyte[0x800d]

#define transbuffer5xbyte[0x800e]

#define transbuffer6xbyte[0x800f]

#define transbuffer7xbyte[0x8010]

#define transbuffer8xbyte[0x8011]

#define transbuffer9xbyte[0x8012]

#define transbuffer10xbyte[0x8013]

#define rxbuffer1xbyte[0x8014]          // 接收缓冲器

#define rxbuffer2xbyte[0x8015]

#define rxbuffer3xbyte[0x8016]

#define rxbuffer4xbyte[0x8017]

#define rxbuffer5xbyte[0x8018]

#define rxbuffer6xbyte[0x8019]

#define rxbuffer7xbyte[0x801a]

#define rxbuffer8xbyte[0x801b]

#define rxbuffer9xbyte[0x801c]

#define rxbuffer10xbyte[0x801d]

#define cdrxbyte[0x801f]                // 时钟频分寄存器

#Include “at89x52.h”

#Include “stdio.h”

#Include “math.h”

#Include “intrins.h”

#Include “ctype.h”

#Include “mylib.h”

#Include “absacc.h”

void init?_can(void)                      // 初始化sja1000主控制器子函数

{

cr=0x01;                              // 控制寄存器为复位

cdr=0;                                // 设置时钟分频器

acr=0;                                // 验收码寄存器

amr=0xff;                             // 验收屏蔽寄存器

btr0=0x31;                            // 总线定时寄存器0

btr1=0x18;                           &

免责声明:矿库网文章内容来源于网络,为了传递信息,我们转载部分内容,尊重原作者的版权。所有转载文章仅用于学习和交流之目的,并非商业用途。如有侵权,请及时联系我们删除。感谢您的理解与支持。

点赞 0
举报
收藏 0
评论 0
分享 0
世纪星标准Modbus协议驱动揭秘(三)

0评论2020-07-1912

PLC外部完成定时器设定修改的方法

0评论2020-07-198

世纪星标准Modbus协议驱动揭秘(一)

0评论2020-07-1913

中文版松下PLC编程手册

0评论2020-07-1911

MODBUS协议在世纪星中的应用

0评论2020-07-1913

串口通讯的概念及接口电路

0评论2020-07-1917

基于SEP4O2O的Linux frame buffer驱动设计

0评论2020-07-1915

用8位单片机实现串口-以太网转换器

0评论2020-07-1913

DSP编程过程中的几个关键问题的研究

0评论2020-07-1923

松下PLC通过MODBUS总线控制LEXIUM 05伺服

0评论2020-07-1912